precision mediump float;
uniform float u_time;
uniform vec2  u_mouse;
uniform vec2  u_resolution;

/**
 * 计算到六边形的距离
 * @param p 当前像素点坐标
 * @param size 六边形大小
 * @return 到六边形的距离
 */
float hexagon(vec2 p, float size) {
    // 将坐标转换为六边形空间
    vec2 q = abs(p);
    
    // 六边形的六个顶点构成的边
    // 这里构建一个特定比例的六边形
    // 上下边长度为size，左右边长度为2*size
    float hexDist = max(q.x * 0.866025 + q.y * 0.5, q.y); // 0.866025 = sqrt(3)/2
    return hexDist - size;
}

/**
 * 创建流光效果
 * @param p 坐标点
 * @param time 时间参数
 * @return 流光强度值
 */
float flowLight(vec2 p, float time) {
    float r = length(vec2(p.x + sin(time), p.y));
    float y = 0.2 * asin(sin(4.0 * p.x));
    
    // 流光效果计算
    float wave = exp(-abs(p.y - y) / 0.1);
    float effect = wave - r * 2.0;
    
    return effect;
}

void main(void){
    // 坐标变换：居中并标准化
    vec2 p = (gl_FragCoord.xy - 0.5 * u_resolution) / min(u_resolution.x, u_resolution.y);
    
    // 调整坐标系缩放，使六边形可见
    p *= 5.0;
    
    // 计算到六边形的距离
    float d = hexagon(p, 1.0);
    
    // 创建六边形基础颜色（黑色背景，白色六边形）
    float hexColor = clamp(1.0 - abs(d) * 2.0, 0.0, 1.0);
    
    // 添加流光效果
    float lightEffect = flowLight(p, u_time);
    
    // 结合六边形和流光效果
    float finalColor = hexColor + lightEffect * 0.5;
    
    // 确保颜色值在有效范围内
    finalColor = clamp(finalColor, 0.0, 1.0);
    
    gl_FragColor = vec4(vec3(finalColor), 1.0);
}